import SSHConfig from 'ssh2-promise/lib/sshConfig'
import { SSHResultType } from '../types'

/**
 * 生成 SSH 结果对象
 *
 * @param options 配置选项
 * - success 操作执行是否成功，默认值 true
 * - server 执行操作的服务器主机地址及端口号，格式为 `host:port`，默认值 '127.0.0.1:22'
 * - message 操作执行的结果描述信息，默认值 '成功'
 * - detail 操作执行的详情信息，如果操作执行成功，则操作的执行结果将存放在此字段中返回；如果操
 * 作执行失败，则错误的详细信息将存放在此字段中返回，默认值 null
 * @returns {SSHResultType} SSH 结果对象
 */
export const genResult = (
  options: {
    success?: boolean
    server?: string
    message?: any
    detail?: any
  } = {}
): SSHResultType => {
  const { success, server, message, detail } = {
    success: true,
    server: '127.0.0.1:22',
    message: '成功',
    detail: null,
    ...options
  }
  return {
    success,
    server,
    message,
    detail
  }
}

export type GenResultType = typeof genResult

/**
 * 根据 SSH 连接服务器配置生成 SSH 结果对象
 *
 * @param {SSHConfig} conf SSH 连接服务器配置
 * @param options 配置选项
 * - success 操作执行是否成功，默认值 true
 * - message 操作执行的结果描述信息，默认值 '成功'
 * - detail 操作执行的详情信息，如果操作执行成功，则操作的执行结果将存放在此字段中返回；如果操
 * 作执行失败，则错误的详细信息将存放在此字段中返回，默认值 null
 * @returns {SSHResultType} SSH 结果对象
 */
export const genResultByConf = (
  conf: SSHConfig,
  options: {
    success?: boolean
    message?: any
    detail?: any
  } = {}
): SSHResultType => {
  return genResult({
    ...options,
    server: `${conf.host ?? '127.0.0.1'}:${conf.port ?? 22}`
  })
}

export type GenResultByConfType = typeof genResultByConf

/**
 * 生成 SSH 成功结果对象
 *
 * @param options 配置选项
 * - server 执行操作的服务器主机地址及端口号，格式为 `host:port`，默认值 '127.0.0.1:22'
 * - message 操作执行的结果描述信息，默认值 '成功'
 * - detail 操作的执行结果，默认值 null
 * @returns {SSHResultType} SSH 成功结果对象
 */
export const genSuccessResult = (
  options: {
    server?: string
    message?: string
    detail?: any
  } = {}
): SSHResultType => {
  return genResult({
    success: true,
    ...options
  })
}

export type GenSuccessResultType = typeof genSuccessResult

/**
 * 根据 SSH 连接服务器配置生成 SSH 成功结果对象
 *
 * @param {SSHConfig} conf SSH 连接服务器配置
 * @param options 配置选项
 * - message 操作执行的结果描述信息，默认值 '成功'
 * - detail 操作的执行结果，默认值 null
 * @returns {SSHResultType} SSH 成功结果对象
 */
export const genSuccessResultByConf = (
  conf: SSHConfig,
  options: {
    message?: string
    detail?: any
  } = {}
): SSHResultType => {
  return genResultByConf(conf, {
    success: true,
    ...options
  })
}

export type GenSuccessResultByConfType = typeof genSuccessResultByConf

/**
 * 生成 SSH 失败结果对象
 *
 * @param options 配置选项
 * - server 执行操作的服务器主机地址及端口号，格式为 `host:port`，默认值 '127.0.0.1:22'
 * - message 操作执行的结果描述信息，默认值 '失败'
 * - detail 错误信息，默认值 null
 * @returns {SSHResultType} SSH 失败结果对象
 */
export const genFailResult = (
  options: {
    server?: string
    message?: string
    detail?: any
  } = {}
): SSHResultType => {
  return genResult({
    success: false,
    ...options
  })
}

export type GenFailResultType = typeof genFailResult

/**
 * 根据 SSH 连接服务器配置生成 SSH 失败结果对象
 *
 * @param {SSHConfig} conf SSH 连接服务器配置
 * @param options 配置选项
 * - message 操作执行的结果描述信息，默认值 '失败'
 * - detail 错误信息，默认值 null
 * @returns {SSHResultType} SSH 失败结果对象
 */
export const genFailResultByConf = (
  conf: SSHConfig,
  options: {
    message?: string
    detail?: any
  } = {}
): SSHResultType => {
  return genResultByConf(conf, {
    success: false,
    ...options
  })
}

export type GenFailResultByConfType = typeof genFailResultByConf
